/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package panels;

import java.util.ArrayList;
import javax.swing.DefaultListModel;
import src.JVentana;
import src.Malla;
import src.Ramo;



/**
 *
 * @author JMix
 */
public class JPanelRequisitos extends javax.swing.JPanel {

    /**
     * Creates new form JPanelRequisitos
     */
    private Malla malla;
    DefaultListModel modeloListaRamos = new DefaultListModel();
    DefaultListModel modeloListaRequisitosRamo = new DefaultListModel();
    
    public JPanelRequisitos() {
        initComponents();
        this.ramos.setModel(modeloListaRamos);
        this.ramosRequisitos.setModel(modeloListaRequisitosRamo);
    }
    
    public void agregarRamo(Ramo ramo){
        modeloListaRamos.addElement(ramo.getNombre());
    }
    
    public ArrayList<String> getRequisitos(){
        ArrayList<String> requisitos = new ArrayList();
        int numRequisitos = this.modeloListaRequisitosRamo.getSize();
        for (int i=0; i<numRequisitos; i++){
            requisitos.add((String)this.modeloListaRequisitosRamo.get(i));
        }
        return requisitos;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnAgregarRequisito = new javax.swing.JButton();
        btnEliminar = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        ramosRequisitos = new javax.swing.JList();
        jScrollPane1 = new javax.swing.JScrollPane();
        ramos = new javax.swing.JList();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();

        btnAgregarRequisito.setText("Agregar");
        btnAgregarRequisito.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                agregarRamoRequisito(evt);
            }
        });

        btnEliminar.setText("Eliminar");
        btnEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                eliminarRamoRequisito(evt);
            }
        });

        ramosRequisitos.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane2.setViewportView(ramosRequisitos);

        ramos.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane1.setViewportView(ramos);

        jLabel1.setText("Ramos");

        jLabel2.setText("Prerequisitos");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(21, 21, 21)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(btnAgregarRequisito, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(btnEliminar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(253, 253, 253)))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel2)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 208, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(102, 102, 102)
                        .addComponent(btnAgregarRequisito)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnEliminar))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(8, 8, 8)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)
                            .addComponent(jScrollPane1))))
                .addContainerGap(38, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void agregarRamoRequisito(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_agregarRamoRequisito
        int index = this.ramos.getSelectedIndex();
        Ramo ramoRequisito = (Ramo) this.ramos.getSelectedValue();
        if(ramoRequisito != null){
            this.modeloListaRequisitosRamo.addElement(ramoRequisito);
            this.modeloListaRamos.removeElement(ramoRequisito);
            this.ramos.setSelectedIndex(index);
        }
        
    }//GEN-LAST:event_agregarRamoRequisito

    private void eliminarRamoRequisito(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_eliminarRamoRequisito
        int index = this.ramos.getSelectedIndex();
        Ramo ramoRequisito = (Ramo) this.ramosRequisitos.getSelectedValue();
        if (ramoRequisito != null){
            this.modeloListaRamos.addElement(ramoRequisito);
            this.modeloListaRequisitosRamo.removeElement(ramoRequisito);
            this.ramosRequisitos.setSelectedIndex(index);
        }
    }//GEN-LAST:event_eliminarRamoRequisito

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAgregarRequisito;
    private javax.swing.JButton btnEliminar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JList ramos;
    private javax.swing.JList ramosRequisitos;
    // End of variables declaration//GEN-END:variables

   /*
    * Dado un ramo, carga el DefaultListModel del JList con los prerequisitos que el ramo tiene asociado
    */
    void mostrarPreRequisitos(Ramo ramo) {
        this.modeloListaRequisitosRamo.removeAllElements();
        ArrayList<Ramo> preRequisitos = ramo.getPreRequisitos();
        if (preRequisitos.size() > 0){
            for (Ramo r : preRequisitos){
                this.modeloListaRequisitosRamo.addElement(r);
                if (this.modeloListaRamos.contains(r)){
                    this.modeloListaRamos.removeElement(r);
                }
            }
        }
    }

    /*
     * Dado un nivel, muestra todos los ramos anteriores a ese nivel
     */
    public void cargarRamosAnteriores(int i) {
        System.out.println("cargando ramos anteriores");
        this.modeloListaRamos.removeAllElements();
//        if (i > 1){
//            for (int nivel=0; nivel < i; nivel++){
//                ArrayList<Ramo> ramosNivel = this.malla.getRamosNivel(nivel);
//                if (ramosNivel != null){
//                    for (Ramo r : ramosNivel){
//                        this.modeloListaRamos.addElement(r);
//                    }
//                }
//            }
//        }
        if (malla != null){
            for(int j=0; j<malla.getDuracion(); j++){
                ArrayList<Ramo> ramosNivel = this.malla.getRamosNivel(j);
                if (ramosNivel != null){
                    for (Ramo ramo : ramosNivel){
                        this.modeloListaRamos.addElement(ramo);
                    }
                }
            }
        }
    }
    
    public ArrayList<Ramo> obtenerPreRequisitos(){
        int cantidad = this.modeloListaRequisitosRamo.getSize();
        ArrayList<Ramo> preRequisitos = new ArrayList();
        for (int i=0; i<cantidad; i++){
            preRequisitos.add((Ramo)this.modeloListaRequisitosRamo.getElementAt(i));
        }
        return preRequisitos;
    }
    
    public void setMalla(Malla malla){
        this.malla = malla;
    }

    void reset() {
        this.modeloListaRamos.removeAllElements();
        this.modeloListaRequisitosRamo.removeAllElements();
    }

    /**boolean existeCurso1(int nivel, String nombre) {
        Ramo ramo = this.malla.getRamo(nivel, nombre);
        if (ramo != null){
            return true;
        }
        return false;
    }**/
    boolean existeCurso(int nivel, String nombre){
        System.out.println("aqui!!");
        nombre = nombre.trim();
        for(int i = 1; i <= malla.getRamos().size(); i++){
            if(malla.getRamos().containsKey(i)){
                for(Ramo ramo : malla.getRamosNivel(i)){
                    String aux = ramo.getNombre().trim();
                    System.out.println(aux+"  and   "+nombre);
                    if(aux.equals(nombre)){
                        return true;
                    }
                }
            }
        }
        
        
        return false;
    }
    

    /**
     * Carga todos los ramos de los niveles anteriores, y los del nivel actual que correspondan
     */
    public void cargarPosiblesPreRequisitos(int nivel, String tipo) {
        this.modeloListaRamos.removeAllElements();
        if (malla != null){
            ArrayList<Ramo> ramosNivel = this.malla.getRamosNivel(nivel);
            this.cargarNivelesAnteriores(nivel);
            switch (tipo) { // Trimestre 1, Trimestre 2, Trimestre 3, Semestre 1, Semestre 2, Anual
                case "Semestre 1":
                    break;
                case "Semestre 2":
                    this.cargarRamosNivel(ramosNivel, "Semestre 1");
                    break;
                case "Trimestre 1":
                    break;
                case "Trimestre 2":
                    this.cargarRamosNivel(ramosNivel, "Trimestre 1");
                    break;
                case "Trimestre 3":
                    this.cargarRamosNivel(ramosNivel, "Trimestre 1");
                    this.cargarRamosNivel(ramosNivel, "Trimestre 2");
                    break;
                case "Anual":
                    break;
            }
        }
    }

    /**
     * Carga todos los ramos anteriores a un nivel, independiente de su tipo (semestral, trimestral, anual)
     */
    private void cargarNivelesAnteriores(int nivel) {
        for (int i=0; i<nivel; i++){
            ArrayList<Ramo> ramosNivel = this.malla.getRamosNivel(i);
            if (ramosNivel != null){
                for (Ramo r : ramosNivel){
                    this.modeloListaRamos.addElement(r);
                }
            }
        }
    }

    /**
     * Dado un conjunto de ramos y un tipo, carga los ramos que tienen dicho tipo
     */
    private void cargarRamosNivel(ArrayList<Ramo> ramosNivel, String tipo) { // tipo: semestre 1, semestre 2
        if (ramosNivel != null){
            for (Ramo ramo : ramosNivel){
                if (ramo.getPeriodo().equals(tipo)){
                    this.modeloListaRamos.addElement(ramo);
                }
            }
        }
    }
}
